#include "tree.h"

namespace NS_TIEC {
  Modifiers::Modifiers(int modifier): modifier_(modifier) {
  }

  void Modifiers::add(int modifier) {
    this->modifier_ |= modifier;
  }

  void Modifiers::operator<<(int modifier) {
    this->modifier_ |= modifier;
  }

  void Modifiers::remove(int modifier) {
    this->modifier_ &= ~modifier;
  }

  bool Modifiers::has(int modifier) const {
    return (this->modifier_ & modifier) != 0;
  }

  TreeKind ExpressionTree::getKind() {
    return TreeKind::kExpression;
  }

  TreeKind StatementTree::getKind() {
    return TreeKind::kStatement;
  }

  TreeKind IdentifierTree::getKind() {
    return TreeKind::kIdentifier;
  }

  TreeKind AnnotationTree::getKind() {
    return TreeKind::kAnnotation;
  }

  bool AnnotatedTree::hasAnnotation(PTR<Name>& name) {
    return annotations_.containsIf([&name](PTR<AnnotationTree>& annotation) -> bool {
      return annotation->ident_->name_ == name;
    });
  }

  TreeKind BlockTree::getKind() {
    return TreeKind::kBlock;
  }

  TreeKind VariableTree::getKind() {
    return TreeKind::kVariable;
  }

  TreeKind MethodTree::getKind() {
    return TreeKind::kMethod;
  }

  TreeKind EventTree::getKind() {
    return TreeKind::kEvent;
  }

  TreeKind CodeTree::getKind() {
    return TreeKind::kCode;
  }

  TreeKind ClassTree::getKind() {
    return TreeKind::kClass;
  }

  TreeKind CompilationUnitTree::getKind() {
    return TreeKind::kTopLevel;
  }

  TreeKind IfTree::getKind() {
    return TreeKind::kIf;
  }

  TreeKind CaseTree::getKind() {
    return TreeKind::kCase;
  }

  TreeKind SwitchTree::getKind() {
    return TreeKind::kSwitch;
  }

  TreeKind ForLoopTree::getKind() {
    return TreeKind::kForLoop;
  }

  TreeKind ForEachTree::getKind() {
    return TreeKind::kForEachLoop;
  }

  TreeKind WhileLoopTree::getKind() {
    return TreeKind::kWhileLoop;
  }

  TreeKind ArrayTypeTree::getKind() {
    return TreeKind::kArrayType;
  }

  TreeKind TemplateTypeTree::getKind() {
    return TreeKind::kTemplateType;
  }

  TreeKind FieldAccessTree::getKind() {
    return TreeKind::kFieldAccess;
  }

  TreeKind MethodInvokeTree::getKind() {
    return TreeKind::kMethodInvoke;
  }

  TreeKind NewClassTree::getKind() {
    return TreeKind::kNewClass;
  }

  TreeKind NewArrayTree::getKind() {
    return TreeKind::kNewArray;
  }

  TreeKind ArrayAccessTree::getKind() {
    return TreeKind::kArrayAccess;
  }

  TreeKind BreakTree::getKind() {
    return TreeKind::kBreak;
  }

  TreeKind ContinueTree::getKind() {
    return TreeKind::kContinue;
  }

  TreeKind ReturnTree::getKind() {
    return TreeKind::kReturn;
  }

  TreeKind SubscribeEventTree::getKind() {
    return TreeKind::kSubscribeEvent;
  }

  TreeKind TypeCastTree::getKind() {
    return TreeKind::kTypeCast;
  }

  TreeKind ExchangeTree::getKind() {
    return TreeKind::kExchange;
  }

  TreeKind InstanceOfTree::getKind() {
    return TreeKind::kInstanceOf;
  }

  TreeKind MultiExprTree::getKind() {
    return TreeKind::kMultiExpr;
  }

  TreeKind AwaitTree::getKind() {
    return TreeKind::kAwait;
  }

  TreeKind ParensTree::getKind() {
    return TreeKind::kParens;
  }

  TreeKind UnaryTree::getKind() {
    return TreeKind::kUnary;
  }

  TreeKind BinaryTree::getKind() {
    return TreeKind::kBinary;
  }

  TreeKind CodeTextTree::getKind() {
    return TreeKind::kCodeText;
  }

  TreeKind CodeRefTree::getKind() {
    return TreeKind::kCodeRef;
  }
}